package com.java.mall_imooc.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.java.mall_imooc.common.enums.OrderStatusEnum;
import com.java.mall_imooc.common.enums.ResultEnum;
import com.java.mall_imooc.common.exception.RRException;
import com.java.mall_imooc.config.WxPayProperties;
import com.java.mall_imooc.entity.Order;
import com.java.mall_imooc.entity.PayInfo;
import com.java.mall_imooc.service.OrderService;
import com.java.mall_imooc.service.PayService;
import com.lly835.bestpay.enums.BestPayTypeEnum;
import com.lly835.bestpay.model.PayResponse;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

/**
 * @author jiangli
 * @since 2020-03-13 23:41
 * 微信支付文档https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5
 * Native支付即扫码支付
 * 用户扫描商户展示在各种场景的二维码进行支付
 * 模式二与模式一相比，流程更为简单，不依赖设置的回调支付URL。
 * 商户后台系统先调用微信支付的统一下单接口，微信后台系统返回链接参数code_url，商户后台系统将code_url值生成二维码图片，用户使用微信客户端扫码后发起支付。
 * 注意：code_url有效期为2小时，过期后扫码不能再发起支付。
 */
@Controller
@RequestMapping("/pay")
@AllArgsConstructor
@Slf4j
public class PayController {
    private PayService payService;
    private WxPayProperties wxPayProperties;
    private OrderService orderService;

    /**
     * 使用best-pay-sdk支付
     * 创建支付并跳转到页面生成支付二维码
     * http://localhost:8080/pay/create?orderNo=1239901840171208705&payType=ALIPAY_PC
     */
    @GetMapping("/create")
    public String create(Model model, @RequestParam("orderNo") String orderNo, @RequestParam("payType") BestPayTypeEnum bestPayTypeEnum) {
        Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderNo));
        if (order == null) {
            throw new RRException(ResultEnum.ORDER_NOT_EXIST);
        }
        if (order.getStatus().equals(OrderStatusEnum.PAID.getCode())) {
            throw new RRException(ResultEnum.ORDER_PAID);
        }
        // 支付方式不同,渲染就不同 WXPAY_NATIVE使用codeUrl生成二维码 ALIPAY_PC使用body生成页面提交
        if (bestPayTypeEnum.equals(BestPayTypeEnum.WXPAY_NATIVE)) {
            PayResponse payResponse = payService.create(orderNo, order.getPayment(), bestPayTypeEnum);
            model.addAttribute("codeUrl", payResponse.getCodeUrl());
            model.addAttribute("orderNo", orderNo);
            model.addAttribute("returnUrl", wxPayProperties.getReturnUrl());
            return "wxPayNative";
        } else if (bestPayTypeEnum.equals(BestPayTypeEnum.ALIPAY_PC)) {
            PayResponse payResponse = payService.create(orderNo, order.getPayment(), bestPayTypeEnum);
            model.addAttribute("body", payResponse.getBody());
            return "aliPayPC";
        }
        throw new RuntimeException("暂不支持的支付类型!");
    }

    /**
     * 支付回调通知处理
     * 要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致，防止数据泄漏导致出现“假通知”，造成资金损失
     */
    @PostMapping("/notify")
    @ResponseBody
    public String asyncNotify(@RequestBody String xmlData) {
        return payService.asyncNotify(xmlData);
    }

    /**
     * 通过订单号查询支付记录
     */
    @GetMapping("/query")
    @ResponseBody
    public PayInfo queryByOrderNo(@RequestParam("orderNo") String orderNo) {
        return payService.queryByOrderNo(orderNo);
    }

}
